const ModbusRTU = require("modbus-serial");
const client = new ModbusRTU();

// --- 需要您填写的信息 ---
const ipAddress = "127.0.0.1";              // 替换成您的设备IP地址
const port = 502;                         // 替换成您的设备端口 (通常是 502)
const unitId = 1;                         // 替换成您的设备 Modbus ID (通常是 1)

//双工位并发测试
//1.先给左右工位写入不同的条码
//2.给左右工位同时写入扫码完成信号
//3.观察PLC是否能正确处理
async function test(){
    try {
        // 连接到设备
        await client.connectTCP(ipAddress, { port: port });
        client.setID(unitId);
        console.log(`Connected to ${ipAddress}:${port}`);
        
        // 1. 写入不同条码到左右工位
        // 假设左工位条码寄存器地址为8062，右工位为8092
        const leftStationBarcode = "LUX12345678960001";
        const rightStationBarcode = "R123456789";
        
        // 将字符串转换为寄存器值
        const leftBarcodeRegisters = stringToRegisters(leftStationBarcode);
        const rightBarcodeRegisters = stringToRegisters(rightStationBarcode);
        
        // 写入左工位条码
        await client.writeRegisters(8100, leftBarcodeRegisters);
        console.log("左工位条码写入成功:", leftStationBarcode);
        
        // 写入右工位条码
        await client.writeRegisters(8150, rightBarcodeRegisters);
        console.log("右工位条码写入成功:", rightStationBarcode);
        
        // 2. 同时写入扫码完成信号
        // 假设左工位扫码完成信号地址为8000，右工位为8030
        await Promise.all([
            client.writeRegister(8130, 1),
            client.writeRegister(8180, 1)
        ]);
        console.log("左右工位扫码完成信号同时写入成功");
        
        // 3. 等待并观察PLC处理结果
        console.log("等待PLC处理...");
        await new Promise(resolve => setTimeout(resolve, 2000));
        
        // 读取处理结果
        const leftResult = await client.readHoldingRegisters(8001, 1);
        const rightResult = await client.readHoldingRegisters(8031, 1);
        
        console.log("左工位处理结果:", leftResult.data[0]);
        console.log("右工位处理结果:", rightResult.data[0]);
        
    } catch (e) {
        console.error("测试出错:", e.message);
    } finally {
        if (client.isOpen) client.close();
        console.log("测试完成，连接已关闭");
    }
}

// 辅助函数：将字符串转换为寄存器值
function stringToRegisters(str) {
    const registers = [];
    for (let i = 0; i < str.length; i += 2) {
        const char1 = str[i] ? str.charCodeAt(i) : 0;
        const char2 = str[i+1] ? str.charCodeAt(i+1) : 0;
        registers.push((char2 << 8) | char1);
    }
    return registers;
}


test()